#include "Shader.h"
#include "glm/glm.hpp"
#include <memory>

namespace Umikaze::Core {
class DrawDepthMaterial {
public:
  void bind(const glm::mat4 &modelMatrix,
            const std::shared_ptr<Buffer> &cameraBuffer);

private:
  static std::unique_ptr<Shader> _shader;
};

class DrawShadowMaterial {
public:
  void bind(const glm::mat4 &modelMatrix, const glm::mat4 &lightSpaceMatrix);

private:
  static std::unique_ptr<Shader> _shader;
};

class MotionVectorMaterial {
public:
  void bind(const glm::mat4 &modelMatrix, const glm::mat4 &oldModelMatrix,
            const glm::mat4 &oldViewMatrix, const glm::mat4 &oldProjMatrix,
            const std::shared_ptr<Buffer> &cameraBuffer);

private:
  static std::unique_ptr<Shader> _shader;
};

class DrawShadowCascadeMaterial {
public:
  void bind(const glm::mat4 &modelMatrix,
            const std::shared_ptr<Buffer> &lightSpaceMatrices,
            uint32_t matrixCount);

private:
  static std::unique_ptr<Shader> _shader;
};

} // namespace Umikaze::Core
